﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Lab2___Mineria_de_datos.Infraestructura;
using System.IO;
using Lab2___Mineria_de_datos.Modelo;
using Lab2___Mineria_de_datos.Main;
using System.Threading;

namespace Lab2___Mineria_de_datos
{
    public partial class MainForm : Form
    {
        private Thread mainThread;
        private bool GenerandoReglas;

        public MainForm()
        {
            GenerandoReglas = false;
            InitializeComponent();
        }

        private void textBox1_Click(object sender, EventArgs e)
        {
            NoErrorNames();
            
            using (openFileDialog_names = new OpenFileDialog())
            {
                openFileDialog_names.Filter = "names files (*.names)|*.names|All files (*.*)|*.*";
                openFileDialog_names.RestoreDirectory = true;

                DialogResult result = openFileDialog_names.ShowDialog();
                
                if (result == DialogResult.OK)
                {
                    textBox_names.Text = openFileDialog_names.FileName;
                    //PathNames = openFileDialog_names.FileName;
                }
            }
        }

        private void textBox2_Click(object sender, EventArgs e)
        {
            NoErrorData();

            using (openFileDialog_data = new OpenFileDialog())
            {
                openFileDialog_data.Filter = "data files (*.data)|*.data|All files (*.*)|*.*";
                openFileDialog_data.RestoreDirectory = true;

                DialogResult result = openFileDialog_data.ShowDialog();

                if (result == DialogResult.OK)
                {
                    textBox_data.Text = openFileDialog_data.FileName;
                    //PathData = openFileDialog_data.FileName;
                }
            }
        }

        private void buttonCargar_names_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(textBox_names.Text))
            {
                toolStripStatusLabel.Text = "Leyendo el archivo \"" + textBox_names.Text + "\"";
                try
                {
                    using (Lector lector = new Lector(textBox_names.Text, TipoArchivoEntrada.Names))
                    {
                        Thread oThread = new Thread(new ThreadStart(lector.getDatos));
                        SuccessNames("Se cargaron los datos correctamente");
                        panelNames.Enabled = false;
                        panelData.Enabled = true;
                    }
                }
                catch (ExtensionDelArchivoNoCoincideException)
                {
                    ErrorEnNames("La extensión del archivo no es \".names\"");
                }
                catch (FileNotFoundException)
                {
                    ErrorEnNames("No se encontró el archivo");
                }
                catch (FileLoadException)
                {
                    ErrorEnNames("No se reconoce la extensión del archivo");
                }
                catch (Exception)
                {
                    ErrorEnNames("Ocurrió un error al intentar leer el archivo");
                }
            }
            else
            {
                ErrorEnNames("Elija un archivo");
            }
        }

        private void buttonCargar_data_Click(object sender, EventArgs e)
        {
            toolStripStatusLabel.Text = "Leyendo el archivo \"" + textBox_data.Text + "\"";
            if (!String.IsNullOrEmpty(textBox_data.Text))
            {
                try
                {
                    using (Lector lector = new Lector(textBox_data.Text, TipoArchivoEntrada.Data))
                    {
                        Thread oThread = new Thread(new ThreadStart(lector.getDatos));
                        panelData.Enabled = false;
                        groupBoxParametros.Enabled = true;
                        buttonIniciar.Enabled = true;
                        SuccessData("Se cargaron los datos correctamente");
                    }
                }
                catch (ExtensionDelArchivoNoCoincideException)
                {
                    ErrorEnData("La extensión del archivo no es \".data\"");
                }
                catch (FileNotFoundException)
                {
                    ErrorEnData("No se encontró el archivo");
                }
                catch (FileLoadException)
                {
                    ErrorEnData("No se reconoce la extensión del archivo");
                }
                catch (Exception)
                {
                    ErrorEnData("Ocurrió un error al intentar leer el archivo");
                }
            }
            else
            {
                ErrorEnData("Elija un archivo");
            }
        }

        #region Usabilidad

        private void ErrorEnNames(string errorMessage)
        {
            labelError_names.Text = errorMessage;
            labelError_names.Visible = true;
            textBox_names.BackColor = Color.LightSalmon;
            pictureBoxNames.Image = Lab2___Mineria_de_datos.Properties.Resources.alert;
            toolStripStatusLabel.Text = "Error!";
        }

        private void ErrorEnData(string errorMessage)
        {
            labelError_data.Text = errorMessage;
            labelError_data.Visible = true;
            textBox_data.BackColor = Color.LightSalmon;
            pictureBoxData.Image = Lab2___Mineria_de_datos.Properties.Resources.alert;
            toolStripStatusLabel.Text = "Error!";
        }

        private void NoErrorNames()
        {
            labelError_names.Text = String.Empty;
            labelError_names.Visible = false;
            textBox_names.BackColor = Color.White;
            pictureBoxNames.Image = Lab2___Mineria_de_datos.Properties.Resources.arrow_right;
            toolStripStatusLabel.Text = "Listo!";
        }

        private void NoErrorData()
        {
            labelError_data.Text = String.Empty;
            labelError_data.Visible = false;
            textBox_data.BackColor = Color.White;
            pictureBoxData.Image = Lab2___Mineria_de_datos.Properties.Resources.arrow_right;
            toolStripStatusLabel.Text = "Listo!";
        }

        private void SuccessNames(string message)
        {
            labelError_names.Text = message;
            labelError_names.Visible = true;
            labelError_names.ForeColor = Color.Green;
            pictureBoxNames.Image = Lab2___Mineria_de_datos.Properties.Resources.check;
            toolStripStatusLabel.Text = "Leído el archivo .names!";
        }

        private void SuccessData(string message)
        {
            labelError_data.Text = message;
            labelError_data.Visible = true;
            labelError_data.ForeColor = Color.Green;
            pictureBoxData.Image = Lab2___Mineria_de_datos.Properties.Resources.check;
            toolStripStatusLabel.Text = "Leído el archivo .data!";
        }

        #endregion

        private void buttonExit_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.Application.Exit();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            using (Entities db = new Entities())
            {
                foreach (MEDICION medicion in db.MEDICION)
                {
                    //db.MEDICION.Remove(medicion);
                    db.DeleteObject(medicion);
                }
                db.SaveChanges();

                foreach (ARBOL arbol in db.ARBOL)
                {
                    db.DeleteObject(arbol);
                }
                db.SaveChanges();

                foreach (NIVEL_ARBOL nivel in db.NIVEL_ARBOL)
	            {
                    db.DeleteObject(nivel);
	            }
                db.SaveChanges();

                foreach (TUPLA tupla in db.TUPLA)
                {
                    //db.TUPLA.Remove(tupla);
                    db.DeleteObject(tupla);
                }
                db.SaveChanges();

                foreach (RANGO rango in db.RANGO)
                {
                    //db.RANGO.Remove(rango);
                    db.DeleteObject(rango);
                }
                db.SaveChanges();

                foreach (ATRIBUTO atributo in db.ATRIBUTO)
                {
                    db.DeleteObject(atributo);
                    //db.ATRIBUTO.Remove(atributo);
                }
                db.SaveChanges();

                foreach (CLASE clase in db.CLASE)
                {
                    //db.CLASE.Remove(clase);
                    db.DeleteObject(clase);
                }
                db.SaveChanges();

                
            }
        }

        private void trackBarSoporte_Scroll(object sender, EventArgs e)
        {
            toolStripStatusLabel.Text = "Listo!";
            toolTipTrackBar.SetToolTip(trackBarSoporte, trackBarSoporte.Value.ToString());
        }

        private void buttonIniciar_Click(object sender, EventArgs e)
        {
            if (GenerandoReglas)
            {
                if (mainThread != null)
                {
                    mainThread.Abort();
                }

                buttonIniciar.ForeColor = Color.DarkOliveGreen;
                buttonIniciar.Image = Properties.Resources.MD_cd_burn;
                buttonIniciar.Text = "Iniciar!";
                GenerandoReglas = false;
            }
            else
            {
                using (ArbolDeCombinatorias combinatoria = new ArbolDeCombinatorias(trackBarSoporte.Value / 100, Convert.ToInt32(numericUpDownMaxReglas.Value)))
                {
                    try
                    {
                        mainThread = new Thread(new ThreadStart(combinatoria.Go));
                        toolStripStatusLabel.Text = "Generando reglas";
                        buttonIniciar.Text = "Detener!";
                        buttonIniciar.Image = Properties.Resources.stop_alt;
                        buttonIniciar.ForeColor = Color.Red;
                        UseWaitCursor = true;
                        groupBoxParametros.Enabled = false;
                    }
                    catch (NoMasCombinaciones)
                    {
                        toolStripStatusLabel.Text = "Obtenidas las reglas!";
                    }
                    finally
                    {
                        UseWaitCursor = false;
                    }
                }
            }
        }
    }
}
